package com.yz.common.limiting;

import jakarta.annotation.Resource;
import org.redisson.api.RRateLimiter;
import org.redisson.api.RateIntervalUnit;
import org.redisson.api.RateType;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;

/**
 * Created With IntelliJ IDEA.
 * Descriptions:
 * <p>
 * User:Mr.Du
 * Date:2024/4/10
 * Time:20:10
 */
@Service
public class RedisLimiter {

    @Resource
    private RedissonClient redissonClient;

    /**
     * 对指定资源进行速率限制。
     * 该方法旨在通过Redis实现对某个资源的请求速率进行限制，以控制资源访问速度，避免过快的访问导致资源耗尽或系统负担过重。
     *
     * @param key 资源的唯一标识符，用于Redis中识别具体的资源。
     * 抛出异常：如果尝试获取访问权限失败（即请求速率超过设定阈值），抛出异常
     */
    public void doRateLimit(String key) {
        // 获取Redisson的速率限制器实例，用于对指定key的资源进行速率限制
        RRateLimiter rRateLimiter = redissonClient.getRateLimiter(key);
        // 异步设置速率限制，每秒最多2个请求
        rRateLimiter.trySetRateAsync(RateType.OVERALL, 2, 1, RateIntervalUnit.SECONDS);
        // 尝试获取访问权限，如果失败则抛出业务异常
        boolean canOp = rRateLimiter.tryAcquire(1);
        if (!canOp) {
            throw new RuntimeException("请求过于频繁");
        }
    }
}
